package Thread2;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建线程的方式三：实现Callable接口
 *
 * 如何理解实现实现Callable接口创建多线程比实现Runnab接口实现多线程强大
 *    1.Callable有返回值，可以抛出异常，被外面的操作捕获，获取异常信息
 *    2.Callable支持泛型
 */
public class Demo4 {
    public static void main(String[] args) {
        //3.创建Callable实现类的对象
        NumThread numThread = new NumThread();
        //4.将此Callable接口的实现类对象传递到FutureTask构造器中，创建FutureTask的对象
        FutureTask futureTask1 = new FutureTask(numThread);
        FutureTask futureTask2 = new FutureTask(numThread);
        //5.将FutureTask对象作为参数传递到Thread的构造器中，创建Thread对象并调用start方法
        Thread thread1 = new Thread(futureTask1,"线程1");
        Thread thread2 = new Thread(futureTask2,"线程2");
        thread1.start();
        thread2.start();
//        try {
//            //6.获取实现类中重写的call方法的返回值
//            //get方法的返回值是FutureTask构造器参数Callable实现类重写的call方法的返回值
//            Object sum = futureTask.get();
//            System.out.println("总和"+sum);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } catch (ExecutionException e) {
//            e.printStackTrace();
//        }
    }
}
//1.创建一个实现Callable的实现类
class NumThread implements Callable{
    //2.实现call方法，将此线程需要执行的操作声明在call()
    @Override
    public Object call() throws Exception {
        int sum = 0 ;
        for (int i = 0; i <=100 ; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
                sum+=i;
            }
        }
//        return sum;
        //有返回值，就必须借助FutureTask类的get()方法获取返回值
        //这里return null 就不需要调用FutureTask类的get()方法获取返回值
        return null;
    }
}
